package com.example.clsj.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
 * 通用的结果封装类，用于API调用返回的数据结构。
 *
 * @param <T> 泛型类型，代表返回数据的具体类型
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Result<T> {
    /**
     * 错误代码，默认为200表示成功。
     */
    private Integer code;

    /**
     * 错误消息。
     */
    private String message;

    /**
     * 返回的实际数据。
     */
    private T data;

    /**
     * 构建一个成功的Result对象，并携带具体的数据。
     *
     * @param data 成功返回的数据
     * @param <T>  数据的类型
     * @return 包含指定数据的成功Result对象
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(data, 200, "成功");
    }

    /**
     * 构建一个成功的Result对象，不携带具体的数据。
     *
     * @param <T> 数据的类型
     * @return 不包含数据的成功Result对象
     */
    public static <T> Result<T> success() {
        return new Result<>(null, 200, "成功");
    }

    /**
     * 构建一个失败的Result对象。
     *
     * @param code   失败的错误代码
     * @param message 失败的错误消息
     * @param <T>    数据的类型
     * @return 包含指定错误代码和消息的失败Result对象
     */
    public static <T> Result<T> fail(Integer code, String message) {
        return new Result<>(null, code, message);
    }

    /**
     * 私有构造方法，用于创建Result对象。
     *
     * @param data   返回的数据
     * @param code   错误代码
     * @param message 错误消息
     */
    private Result(T data, Integer code, String message) {
        this.data = data;
        this.code = code;
        this.message = message;
    }
}
